/*
返回指定对象所有自身属性（非继承属性）的描述对象。

Object.getOwnPropertyDescriptor(obj,key)  专门取出某个属性的描述 不用一下全部取出
*/

const obj = {
	foo: 123,
	get bar() {
		return 'abc'
	}
};

Object.getOwnPropertyDescriptors(obj)
// { foo:
//    { value: 123,
//      writable: true,
//      enumerable: true,
//      configurable: true },
//   bar:
//    { get: [Function: get bar],
//      set: undefined,
//      enumerable: true,
//      configurable: true } }




/*
Object.assign方法总是拷贝一个属性的值，而不会拷贝它背后的赋值方法或取值方法。

Object.getOwnPropertyDescriptors()方法配合Object.defineProperties()方法，就可以实现正确拷贝。
*/
const source = {
	set foo(value) {
		console.log(value);
	}
};
const target2 = {};
Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source)); //这一步就完成了正确拷贝，原理尚不清楚
Object.getOwnPropertyDescriptor(target2, 'foo')
/*
在取出来的时候就好了
{
	get: undefined,
	set: [Function: set foo],
	enumerable: true,
	configurable: true
}
*/



/*
Object.getOwnPropertyDescriptors() 方法的另一个用处， 是配合Object.create() 方法， 将对象属性克隆到一个新对象。 这属于浅拷贝。
*/
const clone = Object.create(Object.getPrototypeOf(obj),
	Object.getOwnPropertyDescriptors(obj));
// 或者
const shallowClone = (obj) => Object.create(
	Object.getPrototypeOf(obj),
	Object.getOwnPropertyDescriptors(obj)
);
